from django.dispatch import receiver
from django.db.models.signals import post_save

from .models import Add
from .tasks import add


@receiver(post_save, sender=Add)
def after_add_save(sender, instance, created, **kwargs):
    # do_stuff()


    # 这里需要格外小心调用 instance.save() 方法，避免导致无限循环
    # 下面提供两种解决方案，
    # 参考地址：https://stackoverflow.com/questions/10840030/django-post-save-preventing-recursion-without-overriding-model-save

    # 第一种方法，调用 save 时，临时取消监听触发事件
    #post_save.disconnect(after_add_save, sender=sender)
    #instance.do_stuff()
    #instance.save()
    #post_save.connect(after_add_save, sender=sender)

    # 第二种方法，在 Model 实例中添加属性（_disable_signals）开关控制
    # 每次更新都在 Celery 进行异步任务，并且 Celery 任务会再次更新数据
    if not instance._disable_signals:
        if created:
            print('loginfo: create #{}'.format(instance.id))
        else:
            print('loginfo: update #{}'.format(instance.id))

        add.delay(instance.id)

